package statefulSB;

import entity.Adesione;
import entity.Articolo;
import entity.UtenteRegistrato;
import java.util.List;
import javax.ejb.EJB;
import javax.ejb.Remove;
import javax.ejb.Stateful;
import sbForEntityClasses.UtenteRegistratoFacadeLocal;

/**
 * Informazioni sulla sessione per l'utente correntemente loggato
 * @author ale
 */
@Stateful
public class UtenteLoggato implements UtenteLoggatoLocal {

    /**
     * Stato dell'iscrizione dell'utente
     */
    public enum StatoIscrizione {
        /**
         * l'utente non si sta iscrivendo un annuncio
         */
        NESSUNO,
        /**
         * in fase di iscrizione
         */
        ISCRIZIONE,
        /**
         * in fase di modifica di un annuncio
         */
        MODIFICA
    }
    @EJB
    private UtenteRegistratoFacadeLocal utenteRegistratoFacade;
    /**
     * facebook token per fare richieste a facebook
     */
    protected String facebookToken = null;
    /**
     * id dell'utente correntemente loggato
     */
    protected Long idUtente;
    /**
     * adesioni dell'utente non ancora salvate
     * ovvero annucni a cui l'utente ha aderito, ma per i quali non ha ancora finito 
     * di specificare gli articoli da acquistare
     */
    protected List<Adesione> adesioniInCorso;
    /**
     * stato dell'iscrizione dell'utente
     */
    protected StatoIscrizione statoIscrizione;

    /**
     * Restituisce lo stato dell'iscrizione dell'utente
     * @return lo stato dell'iscrizione dell'utente
     */
    @Override
    public StatoIscrizione getStatoIscrizione() {
        return statoIscrizione;
    }

    /**
     * Imposta lo stato dell'iscrizione dell'utente
     * @param statoIscrizione lo stato dell'iscrizione dell'utente
     */
    @Override
    public void setStatoIscrizione(StatoIscrizione statoIscrizione) {
        this.statoIscrizione = statoIscrizione;
    }

    /**
     * Get the value of adesioniInCorso
     *
     * @return the value of adesioniInCorso
     */
    @Override
    public List<Adesione> getAdesioniInCorso() {
        return adesioniInCorso;
    }

    /**
     * Set the value of adesioniInCorso
     *
     * @param adesioniInCorso new value of adesioniInCorso
     */
    @Override
    public void setAdesioniInCorso(List<Adesione> adesioniInCorso) {
        this.adesioniInCorso = adesioniInCorso;
    }

    /**
     * Get the value of facebookToken
     *
     * @return the value of facebookToken
     */
    @Override
    public String getFacebookToken() {
        return facebookToken;
    }

    /**
     * Set the value of facebookToken
     *
     * @param facebookToken new value of facebookToken
     */
    @Override
    public void setFacebookToken(String facebookToken) {
        this.facebookToken = facebookToken;
    }

    /**
     * Costruttore vuoto
     */
    public UtenteLoggato() {
    }

    /**
     * Get the value of idUtente
     *
     * @return the value of idUtente
     */
    @Override
    public Long getIdUtente() {
        return idUtente;
    }

    /**
     * Set the value of idUtente
     *
     * @param idUtente new value of idUtente
     */
    @Override
    public void setIdUtente(Long idUtente) {
        this.idUtente = idUtente;
    }

    /**
     * Recupera l'utente correntemente loggato, null se l'utente non è loggato
     * @return l'utente correntemente loggato, null se l'utente non è loggato
     */
    @Override
    public UtenteRegistrato getUtente() {
        return utenteRegistratoFacade.find(idUtente);
    }

    /**
     * Recupera l'adesione in corso per un certo annuncio. 
     * Le adesioni sono identificate dall'annuncio a cui si riferiscono, finché non sono salvate su db
     * @param idAnnuncio id dell'annuncio di cui recuperare l'adesione temporanea
     * @return l'adesione teomporanea riferita all'annuncio in input
     */
    @Override
    public Adesione getAdesioneByAnnuncioId(long idAnnuncio) {
        for (Adesione a : adesioniInCorso) {
            if (a.getAnnuncio().getId().equals(idAnnuncio)) {
                return a;
            }
        }
        return null;
    }

    /**
     * Aggiunge un'adesione alla lista di adesioni temporanee
     * @param adesione la nuova adesione
     */
    @Override
    public void aggiungiAdAdesioni(Adesione adesione) {
        for (Adesione a : adesioniInCorso) {
            if (adesione.getAnnuncio().equals(a.getAnnuncio())) {
                return;
            }
        }
        adesioniInCorso.add(adesione);
    }

    /**
     * Annulla un'adesione temporanea
     * @param idAnnuncio l'id dell'annuncio a cui l'adesione temporanea si riferisce
     */
    @Override
    public void annullaAdesione(long idAnnuncio) {
        Adesione ad = getAdesioneByAnnuncioId(idAnnuncio);
        adesioniInCorso.remove(ad);
    }

    /**
     * Aggiunge un articolo a un'adesioen temporanea
     * @param idAnnuncio l'id dell'annuncio a cui l'adesione temporanea si riferisce
     * @param art articolo da aggiungere
     */
    @Override
    public void aggiungiArticoloAdAdesione(long idAnnuncio, Articolo art) {
        Adesione ad = getAdesioneByAnnuncioId(idAnnuncio);
        ad.getArticoli().add(art);
    }

    /**
     * Cancella le informazioni sulla sessione corrente
     */
    @Remove()
    @Override
    public void remove() {
        idUtente = null;
        adesioniInCorso = null;
    }
    
}
